#pragma once
#include "Dispatcher.h"
#include <sys/select.h>
#include "EventLoop.h"
using namespace std;

class SelectDispatcher : public Dispatcher { // 事件分发器: 包含6个函数指针, 具有检测功能
public:
	SelectDispatcher(EventLoop* evLoop);
	virtual ~SelectDispatcher();

	// 将[_curChannel.fd]添加到select模型
	int add() override;
	// 将[_curChannel.fd]从select模型中删除, 并释放_curChannel所属的TcpConnection
	int remove() override;
	// 修改select模型中的[_curChannel.fd]的属性
	int modify() override;
	// 检测select模型上的[_curChannel.fd]是否被激活(是否有就绪事件), 阻塞等待timeout秒, 并处理就绪事件
	int dispatch(int timeout = 2) override;
private:
	void setFd();
	void deleteFd();

	fd_set _readSet;       // 读事件的集合(位图形式)
	fd_set _writeSet;	   // 写事件的集合(位图形式)
	const int _Max = 1024; // select能监视的最大文件描述符 + 1
};